机器学习预测乳腺肿瘤性质(6)
作者:汪君,专职数据分析,Python和R爱好者
个人微信公众号:学英文和玩数据
前文传送门:
作为开篇,先引用冯诺依曼非常有趣的一句话:
With four parameters I can fit an elephant, and with five I can make him wiggle his trunk
模型的参数选择和调整是机器学习中的重要环节,在本系列的第二篇文章机器学习预测乳腺肿瘤性质(2)中,我们通过人为调整SVM的kernal参数,使SVM分类器的效果有了明显提升,我个人倾向于认为kernal也可以理解为一种广义的机器学习模型的参数。本篇笔记重点关注如何借助sckkit-learn中的最佳参数搜索的方法对前面几种分类器模型参数进行调整,以提升分类器的类别预测效果。
首先我们看看在scikit-learn中这几个分类器模型都有哪些主要参数可以进行调整
一 、SVM支持向量机
在支持向量机函数中,kernal可以选择’linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’,如果kernal选择为rbf、poly、 sigmoid,超参数gamma也可以调整。
二、Logistic回归分类器
logistic regression里面可以调整的超参数有:
penalty:正则惩罚项:使用L1还是L2惩罚项,默认一般是L2.
C : 正则化程度的倒数,C越小,正则化程度越强
solver:优化算法选择,有四个:newton-cg’, ‘lbfgs’, ‘liblinear’, ‘sag’, 默认采取是liblinear的优化算法,该方法对规模小的数据集效果较好,数据集规模较大的时候sag的速度更快. 面对多分类变量问题的时候,只有 ‘newton-cg’, ‘sag’ 和’lbfgs’能处理多分类变量损失函数,‘liblinear’ 只能处理两分类(是或者否). ‘newton-cg’, ‘lbfgs’ 和 ‘sag’ 只支持L2惩罚项。
三、Random Forest 随机森林
在Random Forest 模型中,常见可调参数有 :
n_estimators : 随机森林中树的数量,也就是弱分类器的数量
criterion: 两种衡量分割效果的方法,有基尼系数法和熵法。
max_features : 寻找最佳分割时要考虑特征变量的个数
max_depth :设置决策树最大深度,如果不设置该变量,决策树一直延伸直至每个叶节点都完美分类,或者所有叶节点内数量达到min_samples_split指定的样本数量。
min_samples_split: 分割一个内部节点所要求的最低样本含量,低于这个数量就不再分割了。
max_leaf_nodes : 叶节点最大数目,默认不限制叶节点的最大数量。
min_impurity_split: 如果纯度还高于阈值,继续分割,如果达到阈值,成为叶节点。
bootstrap : 在生长树的时候是否采用bootstrap的方法
四、最佳参数搜索
面对各个分类算法中各种参数,如何设置能使分类器发挥出最佳效果了?scikit-learn提供了多种暴力搜索的方法来进行参数优化,见下图
归纳起来,主要是两种原理,一种是Grid search(网格式搜索),把可调参数排列组合,比如模型有两个参数A和B,参数A有3个取值,参数B有2个取值,组合起来就是6种,用这6种取值去拟合数据后得到6个模型,利用交叉验证和评价指标来筛选最佳参数组合。第二种看函数名就可以猜到,是根据各参数的分布范围随机抽样后组合,同样利用交叉验证和评价指标来筛选最佳参数组合。
(1) 网格搜索
一起来看代码,还是使用我们的乳腺数据,先采用网格搜索。
from sklearn.ensemble import RandomForestClassifier
##先建一个随机森林分类器
rfClf=RandomForestClassifier()
from sklearn.model_selection import GridSearchCV
##设置参数网格,随机森林默认的bootstrap是True,第一个网格只涉及两个参
##数:树的数量和特征变量个数,前者有三个值可以选择,后者有四个值可
##选,有12种组合,后面一个dict格式储存的是另一种网格,在bootstrap参数设
##置为False的情况下,树的数量有两个值可选,max_feature有三个值可选,
##共有6种组合,加上前面12种就是18种组合。
hypermeter_grid=[{‘n_estimators’:[3,10,15],’
max_features’:[2,4,6,8]},
{‘bootstrap’:[False],
’n_estimators’:[3,10],
’max_features’:[2,3,4]}]
##设置三折交叉验证,评价指标选F1
grid_search=GridSearchCV(rfClf,hypermeter_grid,cv=3,scoring=”f1”)
##用不同参数组合去拟合数据,建立模型
grid_search.fit(predi_features,diagnosis==”M”)
##查看最佳参数设置和各种组合的得分情况
gridsearch.best_params gridsearch.grid_scores
最佳参数: {‘max_features’: 6, ‘n_estimators’: 15}
那就是bootstrap设置为True,max_feature设置为6,树数量设置为15的时候效果最好。
(2)随机搜索
接下来我们再试试随机搜索的方法
## 调用scipy里的整数随机分布
from scipy.stats import randint as sp_randint
from sklearn.model_selection import RandomizedSearchCV
## 将max_features,min_samples_split,以及min_samples_leaf的随机分布设置
## 好,注意这里不能用np.random.randomint函数,这里要求的是分布不是抽
## 样结果
random_grid={"max_depth": [3, None],
"max_features": sp_randint(1, 20),
"min_samples_split":sp_randint(2, 11),
"min_samples_leaf": sp_randint(1, 11),
"bootstrap": [True, False],
"criterion": ["gini", "entropy"]}
## 随机抽取10次参数组合
n_iteration=10
## 设置三折交叉验证,评价分数为F1
random_grid_search=RandomizedSearchCV(cv=3,estimator=rfClf,n_iter=n_iteration,
scoring='f1',param_distributions=random_grid)
## 拟合数据
random_grid_search.fit(predi_features,diagnosis=="M")
## 查看最佳F1得分
random_grid_search.best_score_
## 查看最佳参数组合
random_grid_search.best_params_
## 查看10次参数组合的得分情况
random_grid_search.grid_scores_
最佳的F1得分是:0.9362
最佳参数组合:
{‘bootstrap’: False,
‘criterion’: ‘entropy’,
‘max_depth’: None,
‘max_features’: 14,
‘min_samples_leaf’: 3,
‘min_samples_split’: 5}
10次得分情况:
如果这篇笔记对您有帮助,请帮我点赞
Python爱好者社区历史文章大合集:
Python爱好者社区历史文章列表(每周append更新一次)
关注后在公众号内回复“课程”即可获取:
小编的Python入门视频课程!!!
崔老师爬虫实战案例免费学习视频。
丘老师数据科学入门指导免费学习视频。
陈老师数据分析报告制作免费学习视频。
玩转大数据分析!Spark2.X+Python 精华实战课程免费学习视频。
丘老师Python网络爬虫实战免费学习视频。